package uy.org.softtech.cssuite.core;

import static org.apache.commons.lang.StringUtils.remove;
import static org.apache.commons.lang.StringUtils.startsWith;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlTransient;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;


/**
 * Excepcion a ser lanzada cuando ocurre un error no contemplado.
 * 
 * @author fabian.lobo
 */
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason = "mensaje.errorGeneral")
@XmlTransient
public class Excepcion extends Exception {
	
	public enum Codigo {
		
		//Excepciones de base de datos
		ENTIDAD_NO_CREADA("DB000001"), 
		ENTIDAD_NO_ELIMINADA("DB000002"),
		ENTIDAD_NO_ENCONTRADA("DB000003"),
		ENTIDAD_NO_ACTUALIZADA("DB000004"),
		
		//Excepciones de servicios
		CORREO_NO_ENVIADO("SV000001"),
		TOKEN_EXPIRADO("SV000002"),
		
		//Excepciones en Web services
		ERROR_WEBSERVICE("WS000001"),
				
		//Excepcion general
		ERROR_NO_CONTEMPLADO("GL999999");
				
		private String codigo;
		
		Codigo(String codigo){
			this.codigo = codigo;
		}
		
		/**
		 * Retorna el valor del código entre paréntesis rectos ([]).
		 *
		 * @author fabian.lobo
		 */
		String getCodigo() {
			return "[" + codigo + "]";
		}
		
		static String[] listarValores() {
			List<String> valores = new ArrayList<String>();
			for(Codigo codigo : values()) {
				valores.add(codigo.getCodigo());
			}
			return valores.toArray(new String[]{});
		}
	}
	
	private static final long serialVersionUID = 2758413377971272416L;
	
	/**
	 *  Constructor que inicializa la excepcion con un mensaje por defecto.
	 *  
	 *  @author fabian.lobo
	 */
	public Excepcion() {
		this(Codigo.ERROR_NO_CONTEMPLADO, "Error no contemplado.");
	}

	/**
	 * Constructor que inicializa la excepcion con un mensaje dado.
	 *
	 * @param message - Mensaje a ser mostrado.
	 * @author fabian.lobo
	 */
	public Excepcion(String message) {
		this(Codigo.ERROR_NO_CONTEMPLADO, message);
	}
	
	/**
	 * Constructor que inicializa la excepcion con un código y mensaje dados.
	 *
	 * @param codigo - El código asignado
	 * @param message - El mensaje asignado
	 */
	public Excepcion(Codigo codigo, String message) {
		super(codigo.getCodigo() + " " + validaMensaje(message));			
	}
	
	public static String validaMensaje(String mensaje) {
		if (startsWith(mensaje, "[")) {
			for (String codigo : Codigo.listarValores()) {
				mensaje = remove(mensaje, codigo);
			}
		}
		return mensaje;
	}

}
